package app;

import edu.umd.cs.findbugs.annotations.NonNull;
import io.jooby.Extension;
import io.jooby.Jooby;
import io.jooby.MvcFactory;
import io.jooby.annotation.Generated;

import java.util.ServiceLoader;

/**
 * 该模块将使用@Inject和@Path注解的类的
 * 所有方法自动注入到jooby的Router中去
 *
 * 必须有
 * @Inject 和 HttpMethod(@HEAD,@OPTIONS,@GET,@POST,@PATCH,,@PUT,@DELETE)中的任一注解 ;
 */
public class MvcInjectModule implements Extension {
    @Override
    public void install(@NonNull Jooby application) throws Exception {
        ServiceLoader<MvcFactory> mvcFactories = ServiceLoader.load(MvcFactory.class);

        // MVC 注册到容器
        mvcFactories.forEach(factory -> {
            // 获取 @Generated 注解（假设一定存在）
            Class<?> factoryClass = factory.getClass().getAnnotation(Generated.class).value();
            // 创建 Extension 并安装
            Extension extension = factory.create(() -> application.require(factoryClass));
            application.install(extension);
        });
    }
}
